﻿using System;
using System.Collections.Generic;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using WLMCoreLibrary;
using SAW_Core;
using System.Data;
using System.Data.Odbc;
using System.Text;
using System.Configuration;
using System.IO;

namespace SAW
{
    public partial class ModuloInventarios : System.Web.UI.Page
    {
        dbConnector ConexionDB;
        protected override void OnUnload(EventArgs e)
        {
            //ConexionDB.CloseConnection();
            base.OnUnload(e);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            ConexionDB = new dbConnector();
            FuncionesLocales.CheckPagePermision(ref ConexionDB);

            if (Request.QueryString["listado"] == "true")
                if (Request.QueryString["idProducto"] != null)
                {
                    if(Request.QueryString["kardex"]!=null)
                        ListadoJSONKardex(Convert.ToInt32(Request.QueryString["idProducto"]), Convert.ToInt32(Request.QueryString["idAlmacen"]), Convert.ToDateTime(Request.QueryString["fechaInicial"]), Convert.ToDateTime(Request.QueryString["fechaFinal"]));
                    else
                        ListadoJSON(Convert.ToInt32(Request.QueryString["idProducto"]));
                }
                else
                    ListadoInventarioXML();

            if (Request.QueryString["stock"] != null)
                ListadoJSONStock(Convert.ToInt32(Request.QueryString["idProducto"]));

            if (Request.QueryString["RepVentas"] != null)
                    ListadoJSONVentas();

            if (Request.QueryString["listaTraspasos"] != null)
                ListadoJSONTraspasos();

            if (Request.QueryString["listadoTraspasos"] != null)
            {
                panelListaTransferencias.Visible = true;
                PanelGridClientes.Visible = false;
            }


            FuncionesLocales.ManejarMensaje();

            if (Request.QueryString["ListaPrecios"] != null)
            {


                ListaPrecios();


            }

            if (Request.QueryString["ReporteVentas"] != null)
            {
                PanelReporteInventarios.Visible = true;
                PanelGridClientes.Visible = false;
                
            }


            if (Request.QueryString["Add"] == "true")
            {
                PanelGridClientes.Visible = false;
                PanelDatosProducto.Visible = true;
                addProductoButton.Enabled = true;
                //PreloadInfo();
                //if (idRegistroCliente.Text == "0")
                //    PanelClienteSaldoInicial.Visible = true;
            }
            else
            {
                if (Request.QueryString["transferencia"] == "true")
                {
                    PanelGridClientes.Visible = false;
                    PanelAltaTransferencia.Visible = true;
                    botonGuardarTransferencia.Enabled = true;
                    if (!IsPostBack)
                    {
                        AlmacenCollection almacenes = new AlmacenCollection(ref ConexionDB);
                        idAlmacenDestino.DataValueField = "id";
                        idAlmacenDestino.DataTextField = "Nombre";
                        idAlmacenDestino.DataSource = almacenes.Elementos;
                        idAlmacenDestino.DataBind();

                        idAlmacenFuente.DataValueField = "id";
                        idAlmacenFuente.DataTextField = "Nombre";
                        idAlmacenFuente.DataSource = almacenes.Elementos;
                        idAlmacenFuente.DataBind();
                    }

                }
                if (Request.QueryString["idProducto"] != null && !IsPostBack)
                    if (Request.QueryString["editar"] != null)
                    {
                        PanelGridClientes.Visible = false;
                        PanelDatosProducto.Visible = true;
                        LoadRegistry(Convert.ToInt32(Request.QueryString["idProducto"]));
                        addProductoButton.Enabled = true;
                    }
                    else
                    {
                        PanelGridClientes.Visible = false;
                        panelDetalleProducto.Visible = true;
                        if (Request.QueryString["eliminar"] != null)
                            EliminarProducto(Convert.ToInt32(Request.QueryString["idProducto"]));
                        DetalleProducto(Convert.ToInt32(Request.QueryString["idProducto"]));
                    }
            }
            if (Request["materiaPrima"] != null)
            {
                esPanelMateriPrima();


            }
        }
        protected void DetalleProducto(int idProducto)
        {
            Producto producto = new Producto(idProducto, true,ref ConexionDB);
            MediaImage imagen = new MediaImage(producto.idImagen,ref ConexionDB);

            string detalle = "<table><tr><td><h1>" + producto.Clave + " - " + producto.Descripcion + "</h1></td>" +
                "<td><table width=600 style='text-transform:uppercase;'><tr>" +
                    "<th>categoria</th><th>linea</th><th>marca</th><th>Precio A</th>" +
                                "<th>Precio B</th>" +
                                "<th>Precio C</th>" +
                                "<th>Precio D</th></tr>" +
                        "<tr><td>" + producto.Categoria + "</td><td>" + producto.Linea + "</td><td> " + producto.Marca + "</td>"+
                                "<td> " + producto.Precio1.ToString("C") + "</td>" +
                                "<td>" + producto.Precio2.ToString("C") + "</td>" +
                                "<td> " + producto.Precio3.ToString("C") + "</td>" +
                                "<td> " + producto.Precio4.ToString("C") + "</td></tr>" +
                                "</table></td></tr></table>";
            string detalle2 = "";
            if (imagen.id != 0)
                detalle2 += "<br><br><img src='" + imagen.URLImagen + "' width='300'/>";
            LabelDetalleProducto.Text = detalle;
            LabelDetalleProducto2.Text = detalle2;


            idRegistroProducto.Value = producto.id.ToString();
            idRegistroProducto2.Value = producto.id2.ToString();
            Response.Write("<script>" +
                "$().ready(function(){$('#botonEditarProducto').attr('disabled',false);});" +
                "$().ready(function(){$('#botonBorrarProducto').attr('disabled',false);});" +
                "</script>");
        }


        private void ListaPrecios()
        {
            ListaPrecios lista = new ListaPrecios();
            bool incluirIva = Convert.ToBoolean(Request.QueryString["IVA"]);
            bool aExcel=Convert.ToBoolean(Request.QueryString["EXCEL"]);
            bool P1=Convert.ToBoolean(Request.QueryString["A"]);
            bool P2=Convert.ToBoolean(Request.QueryString["B"]);
            bool P3=Convert.ToBoolean(Request.QueryString["C"]);
            bool P4=Convert.ToBoolean(Request.QueryString["D"]);
            string NombreArchivo = lista.XMLListaPrecios(incluirIva,ref ConexionDB);
            
            if (aExcel)
            {StringBuilder salidaArchivo = new StringBuilder();
            salidaArchivo.Append("Categoria,Linea,Marca,Descripcion");
            if (P1)
                salidaArchivo.Append(",Precio A");
            if (P2)
                salidaArchivo.Append(",Precio B");
            if (P3)
                salidaArchivo.Append(",Precio C");
            if (P4)
                salidaArchivo.Append(",Precio D");
            salidaArchivo.Append("\n");
                foreach(CategoriaProductoLista cat in lista.Categorias)
                    foreach (Producto pro in cat.Productos)
                    {
                        salidaArchivo.Append(pro.Categoria.NombreCategoria.ToUpper() + "," + pro.Linea.NombreLinea.ToUpper() + "," + pro.Marca.NombreMarca.ToUpper() + "," + pro.Descripcion.ToUpper());
                        //if (!incluirIva)
                        //{
                            if (P1)
                                salidaArchivo.Append("," + pro.Precio1);
                            if (P2)
                                salidaArchivo.Append("," + pro.Precio2);
                            if (P3)
                                salidaArchivo.Append("," + pro.Precio3);
                            if (P4)
                                salidaArchivo.Append("," + pro.Precio4);
                        //}
                        //else
                        //{
                        //    if (P1)
                        //        salidaArchivo.Append("," + pro.Precio1*1.16M);
                        //    if (P2)
                        //        salidaArchivo.Append("," + pro.Precio2 * 1.16M);
                        //    if (P3)
                        //        salidaArchivo.Append("," + pro.Precio3 * 1.16M);
                        //    if (P4)
                        //        salidaArchivo.Append("," + pro.Precio4 * 1.16M);
                        //}
                        salidaArchivo.Append("\n");
                    }
                SalidaExcel(salidaArchivo.ToString(),"ListaDePrecios.csv");
            }
            else
            {
                
                List<ParametroTransformacionXML> parametros = new List<ParametroTransformacionXML>();
                if (Request.QueryString["A"] != null)
                    parametros.Add(new ParametroTransformacionXML("ListaA", Request.QueryString["A"].ToString()));
                if (Request.QueryString["B"] != null)
                    parametros.Add(new ParametroTransformacionXML("ListaB", Request.QueryString["B"].ToString()));
                if (Request.QueryString["C"] != null)
                    parametros.Add(new ParametroTransformacionXML("ListaC", Request.QueryString["C"].ToString()));
                if (Request.QueryString["D"] != null)
                    parametros.Add(new ParametroTransformacionXML("ListaD", Request.QueryString["D"].ToString()));
                if (Request.QueryString["IVA"] != null)
                    parametros.Add(new ParametroTransformacionXML("IVA", Request.QueryString["IVA"].ToString()));

                string rutaArchivos = "";
                rutaArchivos += "ListaPreciosXML/";

                PDFCreator pdf = new PDFCreator();
                //Generando un 
                string archivoTransformacion = "listaImpresion.xsl";
                string nombreArchivoSalida = "";

                nombreArchivoSalida = NombreArchivo;

                pdf.CrearPDFdeHTML(WLMFunctions.TransformXML(ConfigurationManager.AppSettings["siteURL"] + rutaArchivos + NombreArchivo + ".xml", ConfigurationManager.AppSettings["siteURL"] + ConfigurationManager.AppSettings["XMLStyleFolder"] + archivoTransformacion, parametros), nombreArchivoSalida, rutaArchivos + "PDF/", false, true);
            }


        }

        public void SalidaExcel(string contenidoArchivo, string NombreArchivo)
        {
            HttpContext.Current.Response.ContentType = "application/csv";
            HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + NombreArchivo + ".csv");
            MemoryStream file = new MemoryStream();
            byte[] data = Encoding.UTF8.GetBytes(contenidoArchivo);
            file.Write(data, 0, data.Length);
            HttpContext.Current.Response.OutputStream.Write(file.GetBuffer(), 0, file.GetBuffer().Length);
            HttpContext.Current.Response.OutputStream.Flush();
            HttpContext.Current.Response.OutputStream.Close();
            Response.End();
        }

        protected void esPanelMateriPrima()
        {
            panelProveedoresProducto.GroupingText = "Proveedores de Esta Materia Prima <img src='/iconos/add.png' style='cursor: pointer;' title='Agregar Nuevo Proveedor a la Materia Prima' onclick='nuevoProveedorProducto();'/>";
            panelProductoDatos.GroupingText = "Datos de Materia Prima";
            Response.Write("<script>$().ready(function(){$('[rel=\"PrecioProductoTerminado\"]').hide();$('[rel=\"PrecioMateriaPrima\"]').text(\"Precio de Costo:\");});</script>");
        }

        protected void ListadoInventarioXML()
        {
            AlmacenCollection listaAlmacenes = new AlmacenCollection(ref ConexionDB);
            string listaAlma = "";
            string stockSeleccion = "";
            if (Request["idAlmacen"] != null)
            {
                if (Request["idAlmacen"] != "*")
                {
                    stockSeleccion = " AND S.idAlmacen=" + Request["idAlmacen"] +" ";
                }
            }
            string FieldList = "SELECT P.id,id2,clave," +
                "CONCAT('<span title=\\\'',UPPER(descripcion),'\\\'>',descripcion,'</span>') as descrip," +
                "C.nombreCategoria,L.NombreLinea,M.NombreMarca," +
                "if(" +
                    "(SELECT SUM(S.stock) FROM PRODUCTOSTOCK S WHERE S.idProducto=P.id " + stockSeleccion + ")>(P.stockMinimo+50),CAST(format((SELECT SUM(S.stock) FROM PRODUCTOSTOCK S WHERE S.idProducto=P.id " + stockSeleccion + "),2) AS CHAR)," +
                    "(IF(P.stock<stockMinimo," +
                        "CONCAT('<span class=\\'saldoUrgente\\'>'," +
                        "CAST(format((SELECT SUM(S.stock) FROM PRODUCTOSTOCK S WHERE S.idProducto=P.id " + stockSeleccion + "),2) AS CHAR) ,'</span>')," +
                        "CONCAT('<span class=\\'saldoPendiente\\'>',CAST(format((SELECT SUM(S.stock) FROM PRODUCTOSTOCK S WHERE S.idProducto=P.id " + stockSeleccion + "),2) AS CHAR) ,'</span>')))) as stock1" +
                ",format((SELECT SUM(S.apartados) FROM PRODUCTOSTOCK S WHERE S.idProducto=P.id " + stockSeleccion + "),2) as apartados1," +
                "format((SELECT SUM(S.porSurtir) FROM PRODUCTOSTOCK S WHERE S.idProducto=P.id " + stockSeleccion + "),2) as porsurtir1," +
                "precio1,precio2,precio3," +
                "precio4," +
                "UltimoPrecioCompra " +
                "FROM PRODUCTOS P " +
                "LEFT JOIN PRODUCTOCATEGORIA C ON C.id=P.idCategoria " +
                "LEFT JOIN PRODUCTOLINEA L ON L.id=P.idLinea " +
                "LEFT JOIN PRODUCTOMARCA M ON M.id=P.idMarca " + listaAlma;

            #region filtrado de grid
            string where = "";
            if (Request["_search"] != null)
            {
                if (Request["_search"] == "true")
                {
                    System.Xml.XmlDocument filtrosBusqueda = Newtonsoft.Json.JsonConvert.DeserializeXmlNode("{'var':" + Request.QueryString["filters"] + "}");
                    where = " WHERE P.activo=1 ";
                    foreach (System.Xml.XmlNode filtro in filtrosBusqueda.GetElementsByTagName("rules"))
                    {
                        string searchField = filtro.FirstChild.InnerText;
                        string searchToken = filtro.LastChild.InnerText;
                        switch (searchField)
                        {
                            case "id":
                                where += " AND C.id =" + searchToken + " ";
                                break;
                            //Buscando en Moneda y numeros
                            case "SaldoPagado":
                            case "Total":
                            case "SaldoPendiente":
                                where += " AND " + searchField + "=" + Convert.ToDecimal(searchToken.Replace("$", "").Replace(",", "")) + " ";
                                break;
                            //Busqueda por cadena normal
                            default:
                                where += " AND " + searchField + " LIKE '%" + searchToken + "%'";
                                break;
                        }
                    }
                }
                else where = " WHERE P.activo=1 ";
            }
            #endregion

            //string where = "";
            //string qtype = Request["qtype"];
            string tipoProductos = " AND esProductoTerminado=1 ";
            if (Request["materiaPrima"] != null)
                tipoProductos = " AND esMateriaPrima=1 ";
            where += tipoProductos;
            //if (Request["query"] != null) where = " WHERE P.activo=1 " + tipoProductos + " AND " + qtype + " LIKE '%" + Request["query"] + "%' ";
            //else where = " WHERE P.activo=1 " + tipoProductos;
            PaginacionXML paginacion = WLMFunctions.GetPaginacionXML();
            WLMFunctions.XMLGrid(FieldList,
                where,
                paginacion.SortOrder,
                paginacion.Limit,
                paginacion.DataPage,
                paginacion.RowsPerPage,
                true, false);

        }

        protected void ListadoJSONVentas()
        {

            string FieldList = "SELECT P.id,id2,clave,CONCAT('<span title=\\\'',UPPER(descripcion),'\\\'>',descripcion,'</span>') as descrip,C.nombreCategoria,L.NombreLinea,M.NombreMarca," +
                "if(stock>(stockMinimo+50),CAST(format(stock,2) AS CHAR),(IF(stock<stockMinimo,CONCAT('<span class=\\'saldoUrgente\\'>',CAST(format(stock,2) AS CHAR) ,'</span>'),CONCAT('<span class=\\'saldoPendiente\\'>',CAST(format(stock,2) AS CHAR) ,'</span>')))) as stock1" +
                //Total Vendidos
                ",format(IFNULL((SELECT SUM(cantidad) FROM COTIZACIONESITEMS CI LEFT JOIN COTIZACIONES Cot On Cot.id=CI.idCotizacion WHERE idProducto=P.id AND Cot.status>1),0),2) as vendidos,"+
                //Precio Promedio
                "CONCAT('$',CAST(Format(IFNULL("+
                "IFNULL((SELECT SUM(CI.precio) FROM COTIZACIONESITEMS CI LEFT JOIN COTIZACIONES Cot On Cot.id=CI.idCotizacion WHERE idProducto=P.id AND Cot.status>1),0)/" +
                "IFNULL((SELECT SUM(1) FROM COTIZACIONESITEMS CI LEFT JOIN COTIZACIONES Cot On Cot.id=CI.idCotizacion WHERE idProducto=P.id AND Cot.status>1),0)" +
                ",0),2) AS CHAR))  as precioPromedio," +
                "CONCAT('$',CAST(Format(P.costoPromedio,2) AS CHAR)) as costo1,"+
                // Total Ventas
                "CONCAT('$',CAST(Format(IFNULL((SELECT SUM(cantidad*precio) FROM COTIZACIONESITEMS CI LEFT JOIN COTIZACIONES Cot On Cot.id=CI.idCotizacion WHERE idProducto=P.id AND Cot.status>1),0),2) AS CHAR)) as totalVentas," +
                // Total Ingresos
                "CONCAT('$',CAST(Format("+
                "IFNULL((SELECT SUM(cantidad*precio) FROM COTIZACIONESITEMS CI LEFT JOIN COTIZACIONES Cot On Cot.id=CI.idCotizacion WHERE idProducto=P.id AND Cot.status>1),0)-" +
                "(IFNULL((SELECT SUM(cantidad*P.costoPromedio) FROM COTIZACIONESITEMS CI LEFT JOIN COTIZACIONES Cot On Cot.id=CI.idCotizacion WHERE idProducto=P.id AND Cot.status>1),0))" +
                ",2) AS CHAR)) as totalIngresos " +

                "FROM PRODUCTOS P LEFT JOIN PRODUCTOCATEGORIA C ON C.id=P.idCategoria LEFT JOIN PRODUCTOLINEA L ON L.id=P.idLinea LEFT JOIN PRODUCTOMARCA M ON M.id=P.idMarca";
            int dataPage = Convert.ToInt32(Request["page"]);
            int rowsPerPage = Convert.ToInt32(Request["rp"]);
            string sortname = Request["sortname"];
            //if (sortname == "LimiteCreditoa")
            //    sortname = "LimiteCredito";
            //if (sortname == "precio2a")
            //    sortname = "precio2";
            //if (sortname == "precio3a")
            //    sortname = "precio3";
            string sortorder = Request["sortorder"];
            if (sortname == null) sortname = "id";
            if (sortorder == null) sortorder = "desc";
            string sort = "ORDER BY " + sortname + " " + sortorder;
            if (dataPage == 0) dataPage = 1;
            if (rowsPerPage == 0) rowsPerPage = 50;
            int start = ((dataPage - 1) * rowsPerPage);
            string where = "";
            string qtype = Request["qtype"];
            //if (qtype == "marca")
            //    qtype = "m.nombreMarca";
            //if (qtype == "familia")
            //    qtype = "f.nombreFamilia";
            //if (qtype == "categoria")
            //    qtype = "c.nombreCategoria";
            string tipoProductos = " AND esProductoTerminado=1 ";
            if (Request["materiaPrima"] != null)
                tipoProductos = " AND esMateriaPrima=1 ";
            if (Request["query"] != null) where = " WHERE P.activo=1 " + tipoProductos + " AND " + qtype + " LIKE '%" + Request["query"] + "%' ";
            else where = " WHERE P.activo=1 " + tipoProductos;
            string limit = "LIMIT " + start + ", " + rowsPerPage;

            string strCommand = FieldList + where + sort + " " + limit;

            WLMFunctions.JsonGrid(strCommand, FieldList, where, dataPage);

        }

        protected void ListadoJSON(int idProducto)
        {

            string FieldList = "SELECT C.id,C.NoPedido,C.NombreCliente,C.FechaPedido,CAST(Format(cantidad,2) AS CHAR) as cantidad1," +
                "CONCAT('$',CAST(Format(precio,2) AS CHAR)) as precioa,CONCAT('$',CAST(Format(precio*cantidad,2) AS CHAR)) as total1  ";
            if (Request.QueryString["compras"] != null)
                FieldList += "FROM COMPRASITEMS I LEFT JOIN COMPRAS C ON C.id=I.idCompra";
            else
                FieldList += "FROM COTIZACIONESITEMS I LEFT JOIN COTIZACIONES C ON C.id=I.idCotizacion";
            int dataPage = Convert.ToInt32(Request["page"]);
            int rowsPerPage = Convert.ToInt32(Request["rp"]);
            string sortname = Request["sortname"];
            string sortorder = Request["sortorder"];
            if (sortname == null) sortname = "id";
            if (sortorder == null) sortorder = "desc";
            string sort = "ORDER BY " + sortname + " " + sortorder;
            if (dataPage == 0) dataPage = 1;
            if (rowsPerPage == 0) rowsPerPage = 50;
            int start = ((dataPage - 1) * rowsPerPage);
            string where = "";
            string qtype = Request["qtype"];
            string tipoProductos = "";//" AND esProductoTerminado=1 ";
            if (Request["materiaPrima"] != null)
                tipoProductos = " AND esMateriaPrima=1 ";
            if (Request["query"] != null) where = " WHERE I.idProducto='" + idProducto + "' AND  C.activo=1 AND C.status=4 AND C.idListaPrecios<>-1 " + tipoProductos + " AND " + qtype + " LIKE '%" + Request["query"] + "%' ";
            else where = " WHERE I.idProducto='" + idProducto + "' AND C.activo=1 AND C.status=4 AND C.idListaPrecios<>-1 " + tipoProductos;
            string limit = "LIMIT " + start + ", " + rowsPerPage;

            string strCommand = FieldList + where + sort + " " + limit;

            WLMFunctions.JsonGrid(strCommand, FieldList, where, dataPage);

        }

        protected void ListadoJSONKardex(int idProducto,int idAlmacen, DateTime fechaInicial, DateTime fechaFinal)
        {

            string FieldList = "SELECT M.id,stockInicial,cantidadEntrada,cantidadSalida,stockFinal," +
                "idCotizacion,idCompra,DATE_FORMAT(M.fechaAplicacion,'%d-%m-%Y') as fecha1,if(M.idCliente<>0,C.RazonSocial,P.RazonSocial) as 'RazonSocial'  "+
                "FROM PRODUCTOSSTOCKMOVIMIENTOS M LEFT JOIN CLIENTES C ON C.id=M.idcliente LEFT JOIN PROVEEDORES P ON P.id=M.idProveedor ";
            int dataPage = Convert.ToInt32(Request["page"]);
            int rowsPerPage = Convert.ToInt32(Request["rp"]);
            string sortname = Request["sortname"];
            string sortorder = Request["sortorder"];
            if (sortname == null) sortname = "id";
            if (sortorder == null) sortorder = "desc";
            string sort = "ORDER BY " + sortname + " " + sortorder;
            if (dataPage == 0) dataPage = 1;
            if (rowsPerPage == 0) rowsPerPage = 50;
            int start = ((dataPage - 1) * rowsPerPage);
            string where = "";
            string qtype = Request["qtype"];
            string tipoProductos = "";//" AND esProductoTerminado=1 ";
            if (Request["query"] != null) where = " WHERE M.idProducto='" + idProducto + "' AND M.idAlmacen='" + idAlmacen + "' AND   (fechaAplicacion BETWEEN '" + fechaInicial.ToString("yyyy-MM-dd HH:mm:ss") + "' AND '" + fechaFinal.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss") + "') AND " + qtype + " LIKE '%" + Request["query"] + "%' ";
            else where = " WHERE M.idProducto='" + idProducto + "' AND M.idAlmacen='"+idAlmacen+"' AND (fechaAplicacion BETWEEN '" + fechaInicial.ToString("yyyy-MM-dd HH:mm:ss") + "' AND '" + fechaFinal.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss") + "') " + tipoProductos;
            string limit = "LIMIT " + start + ", " + rowsPerPage;

            string strCommand = FieldList + where + sort + " " + limit;

            WLMFunctions.JsonGrid(strCommand, FieldList, where, dataPage);

        }
        

        protected void ListadoJSONStock(int idProducto)
        {

            string FieldList = "SELECT A.id,A.nombre,CAST(Format(stock,2) AS CHAR) as stock1,CAST(Format(apartados,2) AS CHAR) as stock2,CAST(Format(porSurtir,2) AS CHAR) as stock3" +
                " FROM PRODUCTOSTOCK S LEFT JOIN ALMACENES A ON A.id=S.idAlmacen ";
            int dataPage = Convert.ToInt32(Request["page"]);
            int rowsPerPage = Convert.ToInt32(Request["rp"]);
            string sortname = Request["sortname"];
            string sortorder = Request["sortorder"];
            if (sortname == null) sortname = "id";
            if (sortorder == null) sortorder = "desc";
            string sort = "ORDER BY " + sortname + " " + sortorder;
            if (dataPage == 0) dataPage = 1;
            if (rowsPerPage == 0) rowsPerPage = 50;
            int start = ((dataPage - 1) * rowsPerPage);
            string where = " WHERE idProducto='"+idProducto.ToString()+"' ";
            string qtype = Request["qtype"];
            string limit = "LIMIT " + start + ", " + rowsPerPage;

            string strCommand = FieldList + where + sort + " " + limit;

            WLMFunctions.JsonGrid(strCommand, FieldList, where, dataPage);

        }

        protected void ListadoJSONTraspasos()
        {

            string FieldList = "SELECT DISTINCT C.id,id2,P.clave,CONCAT('<span title=\\\'',UPPER(P.descripcion),'\\\'>',P.descripcion,'</span>') as descrip, C.fechaCreacion, A.Nombre, A2.NOmbre,CI.cantidad,C.id,CI.id " +


                " FROM PRODUCTOS P LEFT JOIN COTIZACIONESITEMS CI ON CI.idProducto=P.id LEFT JOIN COTIZACIONES C ON C.id=CI.idCotizacion " +
                " LEFT JOIN COMPRASITEMS COI on COI.idProducto=P.id LEFT JOIN COMPRAS CO ON CO.id=COI.idCompra AND CO.id=C.idCompra AND CO.idCotizacion<>0 LEFT JOIN ALMACENES A ON A.id=C.idAlmacen LEFT JOIN ALMACENES A2 ON A2.id=CO.idAlmacen ";
            int dataPage = Convert.ToInt32(Request["page"]);
            int rowsPerPage = Convert.ToInt32(Request["rp"]);
            string sortname = Request["sortname"];
            //if (sortname == "LimiteCreditoa")
            //    sortname = "LimiteCredito";
            //if (sortname == "precio2a")
            //    sortname = "precio2";
            //if (sortname == "precio3a")
            //    sortname = "precio3";
            string sortorder = Request["sortorder"];
            if (sortname == null) sortname = "C.id";
            if (sortorder == null) sortorder = "desc";
            string sort = "ORDER BY " + sortname + " " + sortorder;
            if (dataPage == 0) dataPage = 1;
            if (rowsPerPage == 0) rowsPerPage = 50;
            int start = ((dataPage - 1) * rowsPerPage);
            string where = "";
            string qtype = Request["qtype"];
            //if (qtype == "marca")
            //    qtype = "m.nombreMarca";
            //if (qtype == "familia")
            //    qtype = "f.nombreFamilia";
            //if (qtype == "categoria")
            //    qtype = "c.nombreCategoria";
            string tipoProductos = " AND esProductoTerminado=1 ";
            if (Request["materiaPrima"] != null)
                tipoProductos = " AND esMateriaPrima=1 ";
            if (Request["query"] != null) where = " WHERE P.activo=1 AND CO.idCotizacion=C.id  " + tipoProductos + " AND " + qtype + " LIKE '%" + Request["query"] + "%' ";
            else where = " WHERE P.activo=1 AND CO.idCotizacion=C.id " + tipoProductos;
            string limit = "LIMIT " + start + ", " + rowsPerPage;

            string strCommand = FieldList + where + sort + " " + limit;

            WLMFunctions.JsonGrid(strCommand, FieldList, where, dataPage);

        }


        protected void addProductoButton_Click(object sender, EventArgs e)
        {
            GuardarRegistro();
        }

        protected void GuardarRegistro()
        {
            Producto producto;
            if (idRegistroProducto.Value == "0")
            {
                producto = new Producto(ref ConexionDB);
                if (Request["materiaPrima"] != null)
                {
                    string consulta = "SELECT id2 FROM PRODUCTOS WHERE esMateriaPrima=1 ORDER BY id2 DESC LIMIT 1";
                    OdbcDataReader lector = ConexionDB.ExecuteReader(consulta);
                    if (lector.HasRows)
                        producto.id2 = Convert.ToInt32(lector["id2"]) + 1;
                }
                else
                {
                    string consulta = "SELECT id2 FROM PRODUCTOS WHERE esProductoTerminado=1 ORDER BY id2 DESC LIMIT 1";
                    OdbcDataReader lector = ConexionDB.ExecuteReader(consulta);
                    if (lector.HasRows)
                        producto.id2 = Convert.ToInt32(lector["id2"]) + 1;
                }
            }
            else
            {
                producto = new Producto(Convert.ToInt32(idRegistroProducto.Value),ref ConexionDB);
                producto.id2 = Convert.ToInt32(idRegistroProducto2.Value);
            }
            producto.idLinea = GuardarLinea(lineaProducto.Text); //Convert.ToInt32(idLineaProducto.Value);
            producto.idCategoria = GuardarCategoria(categoriaProducto.Text); // Convert.ToInt32(idCategoriaProducto.Value);
            producto.idMarca = GuardarMarca(marcaProducto.Text); //Convert.ToInt32( idMarcaProducto.Value);
            producto.Modelo = ModeloProducto.Text;
            producto.SKU = SKUProducto.Text;
            producto.Clave = producto.idCategoria.ToString("000") + "-" + producto.idLinea.ToString("000") + "-" + producto.id2.ToString("0000");
            producto.Descripcion = DescripcionProducto.Text;
            producto.Precio1 = WLMFunctions.MonedaADecimal(Precio1Producto.Text);
            producto.Precio2 = WLMFunctions.MonedaADecimal(Precio2Producto.Text);
            producto.Precio3 = WLMFunctions.MonedaADecimal(Precio3Producto.Text);
            producto.Precio4 = WLMFunctions.MonedaADecimal(Precio4Producto.Text);
            producto.Stock = WLMFunctions.MonedaADecimal(StockProducto.Text);
            producto.StockMinimo = WLMFunctions.MonedaADecimal(StockMinimoProducto.Text);
            producto.StockMaximo = WLMFunctions.MonedaADecimal(StockMaximoProducto.Text);
            producto.Peso = WLMFunctions.MonedaADecimal(PesoProducto.Text);
            producto.UnidadMedida = UnidadMedidaProducto.Text;
            if (Request["materiaPrima"] != null)
                producto.EsMateriaPrima = true;
            else
                producto.EsProductoTerminado = true;

            //producto.Apartados = Apartados.Text;
            producto.idImagen = Convert.ToInt32(idImagenProducto.Value);
            producto.Save();

            //Guardado de Proveedores de el producto
            int totalProveedores = Convert.ToInt32(Request["cantidadProveedoresProducto"]);
            for (int x = 1; x <= totalProveedores; x++)
            {
                if (Request["razonSocialProveedor" + x] != "")
                {
                    Proveedor proveedor;
                    if (Request["ProveedorId" + x] == "0")
                    {
                        //Guardando de manera automatica un nuevo proveedor en caso de 
                        //que los datos capturados no se encuentren en el sistema
                        proveedor = new Proveedor(ref ConexionDB);
                        proveedor.RazonSocial = Request["razonSocialProveedor" + x];
                        proveedor.NombreComercial = Request["nombreComercialProveedor" + x];
                        proveedor.Telefono = Request["telefonoProveedor" + x];
                        proveedor.Email = Request["emailProveedor" + x];
                        proveedor.Save();
                    }
                    else
                        proveedor = new Proveedor(Convert.ToInt32(Request["ProveedorId" + x]),ref ConexionDB);

                    //Generando una conexion entre producto y proveedor
                    ProductoAProveedor relacion = new ProductoAProveedor(producto, proveedor,ref ConexionDB);
                    if (Request["ProveedorEliminado" + x] != "true")
                    {
                        if (relacion.id == 0)//buscando si ya exise una relacion previa para actualizarla
                            relacion = new ProductoAProveedor(ref ConexionDB);
                        relacion.idProducto = producto.id;
                        relacion.idProveedor = proveedor.id;
                        if (Request["precioProductoProveedor" + x] != null && Request["precioProductoProveedor" + x] != "")
                            relacion.PrecioProveedor = WLMFunctions.MonedaADecimal(Request["precioProductoProveedor" + x]);
                        relacion.Save();
                    }
                    else
                        relacion.Delete();

                }
            }
            ConexionDB.CloseConnection();
            if (producto.EsMateriaPrima)
                Response.Redirect("/ModuloInventarios.aspx?materiaPrima=true");
            else
                Response.Redirect("/ModuloInventarios.aspx");
        }

        protected int GuardarLinea(string NombreLinea)
        {
            ProductoLinea linea = new ProductoLinea(NombreLinea.ToLower(),ref ConexionDB);
            //if (linea.NombreLinea.ToLower() != NombreLinea.ToLower()|| 
            if (linea.id == 0)
            {
                linea = new ProductoLinea(ref ConexionDB);
                linea.NombreLinea = NombreLinea.ToLower();
                linea.Save();
            }
            return linea.id;
        }

        protected int GuardarCategoria(string NombreCategoria)
        {
            ProductoCategoria categoria = new ProductoCategoria(NombreCategoria.ToLower(),ref ConexionDB);
            if (categoria.id == 0)
            {
                categoria = new ProductoCategoria(ref ConexionDB);
                categoria.NombreCategoria = NombreCategoria.ToLower();
                categoria.Save();
            }
            //if (categoria.NombreCategoria.ToLower() != NombreCategoria.ToLower())
            return categoria.id;
        }

        protected int GuardarMarca(string NombreMarca)
        {
            ProductoMarca marca = new ProductoMarca(NombreMarca.ToLower(),ref ConexionDB);
            if (marca.id == 0)
            //if (marca.NombreMarca.ToLower() != NombreMarca.ToLower())
            {
                marca = new ProductoMarca(ref ConexionDB);
                marca.NombreMarca = NombreMarca.ToLower();
                marca.Save();
            }
            return marca.id;
        }

        protected void LoadRegistry(int idRegistry)
        {
            Producto producto = new Producto(idRegistry,ref ConexionDB);
            idMarcaProducto.Value = producto.idMarca.ToString();
            ModeloProducto.Text = producto.Modelo;
            SKUProducto.Text = producto.SKU;
            ClaveProducto.Text = producto.Clave;
            DescripcionProducto.Text = producto.Descripcion;
            Precio1Producto.Text = producto.Precio1.ToString("C");
            Precio2Producto.Text = producto.Precio2.ToString("C");
            Precio3Producto.Text = producto.Precio3.ToString("C");
            Precio4Producto.Text = producto.Precio4.ToString("C");
            StockProducto.Text = producto.Stock.ToString();
            StockMinimoProducto.Text = producto.StockMinimo.ToString();
            StockMaximoProducto.Text = producto.StockMaximo.ToString();
            UnidadMedidaProducto.Text = producto.UnidadMedida;
            idLineaProducto.Value = producto.idLinea.ToString();
            idCategoriaProducto.Value = producto.idCategoria.ToString();
            idRegistroProducto.Value = producto.id.ToString();
            idRegistroProducto2.Value = producto.id2.ToString();

            categoriaProducto.Text = new ProductoCategoria(producto.idCategoria,ref ConexionDB).NombreCategoria;
            lineaProducto.Text = new ProductoLinea(producto.idLinea,ref ConexionDB).NombreLinea;
            marcaProducto.Text = new ProductoMarca(producto.idMarca,ref ConexionDB).NombreMarca;
            PesoProducto.Text = producto.Peso.ToString();
            MediaImage imagen = new MediaImage(producto.idImagen,ref ConexionDB);
            bool imagenCarcada = false;
            if (imagen.id != 0)
            {
                ImagenSubida.ImageUrl = imagen.URLImagen;
                ImagenSubida.Style.Clear();
                imagenCarcada = true;
                idImagenProducto.Value = imagen.id.ToString();
            }

            StringBuilder provs = new StringBuilder();
            ProveedorCollection listaProveedores = new ProveedorCollection(producto,ref ConexionDB);
            provs.Append("<script>$(document).ready(function () {");
            if (imagenCarcada)
                provs.Append(" $('#FileUploaderButton').hide();\n");
            foreach (Proveedor prov in listaProveedores.Elementos)
            {

                provs.Append("cargarProveedorProducto('" + prov.id + "','" + prov.RazonSocial + "','" + prov.NombreComercial + "','" + new ProductoAProveedor(producto, prov,ref ConexionDB).PrecioProveedor.ToString("C") + "','" + prov.Telefono + "','" + prov.Email + "');");
            }
            provs.Append("});</script>");
            proveedoresActuales.Text = provs.ToString();
            if (producto.EsMateriaPrima)
                esPanelMateriPrima();
        }

        private void EliminarProducto(Int32 idProducto)
        {
            Producto producto = new Producto(idProducto,ref ConexionDB);
            string mensaje = "el producto " + producto.Descripcion + " [" + producto.Clave + "] ha sido eliminado del sistema";
            producto.Delete();
            ConexionDB.CloseConnection();
            if (producto.EsMateriaPrima)
                Response.Redirect("/ModuloInventarios.aspx?materiaPrima=true&mensaje=" + mensaje);
            else
                Response.Redirect("/ModuloInventarios.aspx?mensaje=" + mensaje);
        }

        protected void botonGuardarTransferencia_Click(object sender, EventArgs e)
        {
            GuardarCotizacion();
        }

        protected void GuardarCotizacion()
        {
            Venta cotizacion;
            Cliente cliente = new Cliente(Convert.ToInt32(ConfigurationManager.AppSettings["idClientePOS"]),ref ConexionDB);

            cotizacion = new Venta(ref ConexionDB);

            cotizacion.idCliente = cliente.id;
            cotizacion.NombreCliente = cliente.RazonSocial + " [TRASPASO A " + new Almacen(Convert.ToInt32(idAlmacenDestino.SelectedValue), ref ConexionDB).Nombre + "]";
            cotizacion.NombreComercialCliente = cliente.NombreComercial;
            cotizacion.RFCCliente = cliente.RFC;
            cotizacion.F_Calle = cliente.DireccionFacturacion.Calle;
            cotizacion.F_NumeroExterior = cliente.DireccionFacturacion.NumeroExterior;
            cotizacion.F_NumeroInterior = cliente.DireccionFacturacion.NumeroInterior;
            cotizacion.F_Colonia = cliente.DireccionFacturacion.Colonia;
            cotizacion.F_Municipio = cliente.DireccionFacturacion.Municipio;
            cotizacion.F_Ciudad = cliente.DireccionFacturacion.Ciudad;
            cotizacion.F_Estado = cliente.DireccionFacturacion.Estado;
            cotizacion.F_CP = cliente.DireccionFacturacion.Calle;

            cotizacion.FechaVencimiento = DateTime.Now;
            cotizacion.TiempoEntrega = "Mismo Dia";
            cotizacion.CondicionesPago = "Efectivo";
            cotizacion.Observaciones = ObservacionesVenta.Text;
            cotizacion.SubTotal = 0;
            cotizacion.Descuento = 0;
            //cotizacion.DescuentoPorcentaje =WLMFunctions.MonedaADecimal( DescuentoPorcentaje.Text);
            cotizacion.IVA = 0;
            cotizacion.Total = 0;
            cotizacion.idListaPrecios = -1;
            cotizacion.idCondicionesPago = 1;
            cotizacion.DiasCredito = new Condicionespago(cotizacion.idCondicionesPago,ref ConexionDB).dias;
            cotizacion.IdAlmacen = Convert.ToInt32(idAlmacenFuente.SelectedValue);
            //           cotizacion.Save();
            int NumeroConceptos = Convert.ToInt32(Request["cantidadConceptosInventario"]);
            for (int x = 1; x <= NumeroConceptos; x++)
            {
                GuardarConcepto(cotizacion, x);

            }

            string mensaje = "Se ha dado de alta correctamente la cotizacion para el cliente <b>" + cotizacion.NombreCliente + "</b> por un total de <b>" + cotizacion.Total.ToString("C") + "</b>";
            Session["mensajeCotizacion"] = mensaje;
            Session["mensaje"] = mensaje;
            //ResultadoProcesoCotizacion.Text = mensaje;
            mensaje = Server.UrlEncode(mensaje);

            cotizacion.SaldoPendiente = cotizacion.Total;
            cotizacion.Save();
            int idCotizacionActual = cotizacion.id;

            cotizacion = new Venta(idCotizacionActual, true,ref ConexionDB);
            cotizacion.ConvertirAPedido();
            cotizacion.GenerarRemision();
            
            cotizacion = new Venta(idCotizacionActual, true,ref ConexionDB);
            cotizacion.GenerarSalida();
            

            Compra compra;
            cliente = new Cliente(Convert.ToInt32(ConfigurationManager.AppSettings["idClientePOS"]),ref ConexionDB);

            compra = new Compra(ref ConexionDB);
            cotizacion.idCompra = compra.id;
            compra.idCotizacion = cotizacion.id;
            cotizacion.Save();
            compra.idProveedor = cliente.id;
            compra.NombreCliente = cliente.RazonSocial + " [TRASPASO DESDE " + new Almacen(Convert.ToInt32(idAlmacenFuente.SelectedValue), ref ConexionDB).Nombre + "]";
            compra.NombreComercialCliente = cliente.NombreComercial;
            compra.RFCProveedor = cliente.RFC;
            compra.F_Calle = cliente.DireccionFacturacion.Calle;
            compra.F_NumeroExterior = cliente.DireccionFacturacion.NumeroExterior;
            compra.F_NumeroInterior = cliente.DireccionFacturacion.NumeroInterior;
            compra.F_Colonia = cliente.DireccionFacturacion.Colonia;
            compra.F_Municipio = cliente.DireccionFacturacion.Municipio;
            compra.F_Ciudad = cliente.DireccionFacturacion.Ciudad;
            compra.F_Estado = cliente.DireccionFacturacion.Estado;
            compra.F_CP = cliente.DireccionFacturacion.Calle;

            compra.FechaVencimiento = DateTime.Now;
            compra.TiempoEntrega = "Mismo Dia";
            compra.CondicionesPago = "Efectivo";
            compra.Observaciones = ObservacionesVenta.Text;
            compra.SubTotal = 0;
            compra.Descuento = 0;
            //Compra.DescuentoPorcentaje =WLMFunctions.MonedaADecimal( DescuentoPorcentaje.Text);
            compra.IVA = 0;
            compra.Total = 0;
            compra.idListaPrecios = -1;
            compra.idCondicionesPago = 1;
            compra.DiasCredito = new Condicionespago(compra.idCondicionesPago,ref ConexionDB).dias;
            compra.IdAlmacen = Convert.ToInt32(idAlmacenDestino.SelectedValue);
            //           Compra.Save();
            NumeroConceptos = Convert.ToInt32(Request["cantidadConceptosInventario"]);
            for (int x = 1; x <= NumeroConceptos; x++)
            {
                GuardarConcepto(compra, x);

            }

            mensaje = "Se ha dado de alta correctamente la Compra para el cliente <b>" + compra.NombreCliente + "</b> por un total de <b>" + compra.Total.ToString("C") + "</b>";
            Session["mensajeCompra"] = mensaje;
            Session["mensaje"] = mensaje;
            //ResultadoProcesoCompra.Text = mensaje;
            mensaje = Server.UrlEncode(mensaje);

            compra.SaldoPendiente = compra.Total;
            compra.Save();
            int idCompraActual = compra.id;

            compra = new Compra(idCompraActual, true,ref ConexionDB);
            compra.ConvertirAPedido();
            compra.Status = 2;
            compra.Save();
            compra = new Compra(idCompraActual, true,ref ConexionDB);
            compra.GenerarEntradaAlmacen();
            compra.Save();          




            ConexionDB.CloseConnection();

            Response.Redirect("/ModuloInventarios.aspx?listadoTraspasos=1");//+"&mensaje="+mensaje);

        }

        protected void GuardarConcepto(Venta cotizacion, int x)
        {
            if (Request["idProductoConceptoInventario" + x] != "0")
            {
                //Response.Write(Request["idProductoConcepto" + x]+Request["ConceptoEliminado" + x] + Request["cantidadConcepto" + x]);
                if (Request["ConceptoEliminadoInventario" + x] != "true" || Request["cantidadConceptoInventario" + x] != "0")
                {
                    VentaItem item;
                    item = new VentaItem(ref ConexionDB);

                    item.idCotizacion = cotizacion.id;
                    item.idProducto = Convert.ToInt32(Request["idProductoConceptoInventario" + x]);
                    item.UnidadMedida = Request["unidadConceptoInventario" + x];
                    item.Clave = Request["claveConceptoInventario" + x];
                    item.Categoria = Request["categoriaConceptoInventario" + x];
                    item.Linea = Request["lineaConceptoInventario" + x];
                    item.Marca = Request["marcaConceptoInventario" + x];
                    item.Descripcion = Request["descripcionConceptoInventario" + x];
                    item.Precio = 0;// WLMFunctions.MonedaADecimal(Request["precioConceptoPOS" + x]);
                    item.Cantidad = WLMFunctions.MonedaADecimal(Request["cantidadConceptoInventario" + x]);
                    item.Save();
                }
                else
                {
                    VentaItem item;
                    item = new VentaItem(Convert.ToInt32(Request["ConceptoCotizacionId" + x]),ref ConexionDB);
                    Response.Write(x + "Eliminado");
                    item.Delete();
                }
            }
        }

        protected void GuardarConcepto(Compra compra, int x)
        {
            if (Request["idProductoConceptoInventario" + x] != "0")
            {
                //Response.Write(Request["idProductoConcepto" + x]+Request["ConceptoEliminado" + x] + Request["cantidadConcepto" + x]);
                if (Request["ConceptoEliminadoInventario" + x] != "true" || Request["cantidadConceptoInventario" + x] != "0")
                {
                    CompraItem item;
                    item = new CompraItem(ref ConexionDB);

                    item.idCompra = compra.id;
                    item.idProducto = Convert.ToInt32(Request["idProductoConceptoInventario" + x]);
                    
                    item.Clave = Request["claveConceptoInventario" + x];
                    item.Categoria = Request["categoriaConceptoInventario" + x];
                    item.Linea = Request["lineaConceptoInventario" + x];
                    item.Marca = Request["marcaConceptoInventario" + x];
                    item.Descripcion = Request["descripcionConceptoInventario" + x];
                    item.Precio = 0;// WLMFunctions.MonedaADecimal(Request["precioConceptoPOS" + x]);
                    item.Cantidad = WLMFunctions.MonedaADecimal(Request["cantidadConceptoInventario" + x]);
                    item.Save();
                }
                else
                {
                    VentaItem item;
                    item = new VentaItem(Convert.ToInt32(Request["ConceptoCotizacionId" + x]),ref ConexionDB);
                    Response.Write(x + "Eliminado");
                    item.Delete();
                }
            }
        }
    }
}